package br.com.redefranciscanas.wiki.persistence;

import java.util.List;

import javax.persistence.NoResultException;
import javax.persistence.Query;

import br.com.redefranciscanas.wiki.domain.Topico;

public class TopicoDao extends Dao {

	public TopicoDao() {
		super();
	}

	public Topico buscaTopicoPeloId(Long id) {
		Topico topico;
		Query query = getSession().createNamedQuery("Topico.findById");
		query.setParameter("id", id);
		try {
			topico = (Topico) query.getSingleResult();
		} catch (NoResultException e) {
			topico = null;
		}
		return topico;
	}
	
	public Topico buscaTopicoPeloTitulo(String titulo) {
		Topico topico;
		Query query = getSession().createNamedQuery("Topico.findByTitulo");
		query.setParameter("titulo", titulo);
		try {
			topico = (Topico) query.getSingleResult();
		} catch (NoResultException e) {
			topico = null;
		}
		return topico;
	}

	public void insere(Topico topico) {
		if (!verificaSeHaTopicoComTitulo(topico.getTitulo())) {
			try {
				setTransaction(getSession().getTransaction());
				getTransaction().begin();
				getSession().persist(topico);
				getTransaction().commit();
				System.out.println("Topico inserido com sucesso!");
			} catch (Exception e) {
				getTransaction().rollback();
				System.out.println("Erro ao inserir! " + e.getMessage());
			}
		} else {
			System.out.println("Topico não foi inserido com sucesso!");
		}
	}

	@SuppressWarnings("unchecked")
	public List<Topico> buscaLikeResumo(String resumo) {
		List<Topico> topico;
		Query query = getSession().createNamedQuery("Topico.findByResumo");
		query.setParameter("resumo", "%" + resumo + "%");
		try {
			topico = query.getResultList();
		} catch (NoResultException e) {
			topico = null;
		}
		return topico;
	}

	// TODO
	public void atualiza(Topico topico) {
		try {
			setTransaction(getSession().getTransaction());
			getTransaction().begin();
			getSession().merge(topico);
			getTransaction().commit();

		} catch (Exception e) {
			getTransaction().rollback();
			System.out.println("Erro ao atualizar! " + e.getMessage());
		}
	}

	// TODO
	public void deleta(Topico funcionario) {
		try {
			setTransaction(getSession().getTransaction());
			getTransaction().begin();
			getSession().remove(funcionario);
			getTransaction().commit();
		} catch (Exception e) {
			getTransaction().rollback();
			System.out.println("Erro ao deletar! " + e.getMessage());
		}
	}

	public boolean verificaSeHaTopicoComTitulo(String titulo) {
		if (buscaTopicoPeloTitulo(titulo) != null) {
			return true;
		} else {
			return false;
		}
	}

}
